人工神经网络案例
山东理工大学 数学学院 周世祥 shixiangbupt@qq.com
人们已经知道,生物对信息的处理,主要依靠大脑内部的神经网络进行,神经网络的基本单元是神经细胞,也叫神经元,如图
•生物神经网络的工作机制:
整个网络接收的信息由各个神经元一起接收,即每个神经元从外界接收一部分信息,然后各自进行处理,将结果输出;
所有神经元的输出结果组合起来,构成整个神经网络对信息处理的最终结果 。
人工神经网络的结构
了解到生物神经网络的优点,人们模仿它们的结构,构造了人工神经网络
整体结构:一般为层状结构,每层由若干个神经元组成,层与层之间由联结权值相连
•输入层:左边,接受外界信息
•隐含层:中间,对信息进行处理
•输出层:右边,把处理结果输出
人工神经元
•人工神经网络是由若干个人工神经元组成的,就是上图中的小圆
•人工神经元是人工神经网络的基本结构单元,也是基本功能单元
典型的人工神经元的结构如图所示
从上图可以看到,人工神经元的构成:
信息的输入、求和单元、联结权值、激活函数、输出等
人工神经网络的特点
由于结构和工作机制与生物神经网络相似,所以,人工神经网络也具有类似的特点
1. 具有自学习能力:人工神经网络可以通过训练进行自学习,优化自己的结构,掌握接收的信息包含的一些规律
2. 高度的非线性全局作用:
人工神经网络中的神经元互相联结,每个神经元都会接受其它神经元输入的信息,同时也向其它神经元输出信息
整个神经网络接收的信息分布在所有神经元中
整个网络对信息的处理是所有神经元共同处理的结果
处理结果也分布在每个神经元中
所以,整个网络的性能取决于所有神经元的性能,表现为一种高度的非线性全局作用
3. 良好的容错性:
由于人工神经网络的结构和功能具有整体性特征,所以,整个网络对信息的处理具有较好的容错性:即使有部分神经元出现了错误,但对整体的处理结果影响比较有限
4. 高度的并行处理能力
人工神经网络里的神经元以并联方式组成,从而对信息有很强的并行处理能力
优势:处理图像或声音等信息时,有很高的处理速度、准确率、记忆功能和联想功能等
研究者已经证明:人工神经网络是一个通用的函数逼近模型,通过选择合适的激活函数及适当的结构,包括层数和每层的神经元数量,理论上可以方便、快速地以任意精度逼近任何复杂的函数
•所以,人工神经网络是一个万能的经验公式,具有很强的逼近能力,特别擅长处理输入与输出元素间存在复杂的非线性关系的问题,尤其是多元、高次问题
•人工神经网络就适合进行这类工作,尤其对其内在规律不了解因而不能建立明确的物理和数学模型者
•人工神经网络不仅能研究输入因素与输出因素间的定性关系,而且能方便地研究它们间的定量关系,具有精度高、成本低等优点
人工神经网络有多个类型,每种类型的特点、性能和应用领域都不同。人们一般使用反向传播(Back-Propogation,简称BP网络)或径向基函数(Radial Basis Function,简称RBF)模型解决预测问题
设计网络的结构
(1)层数。人工神经网络模型最少需要三层:一个输入层、一个隐含层和一个输出层
隐含层的数量可以增加。一般来说,隐含层的层数越多,预测精度越高,但是需要的训练时间会越长。对一般的问题,用三层网络就可以
输入层神经元的数量是由问题的影响因素决定的,比如,要根据材料的化学成分预测它的强度,有几种化学成分,输入层就设计几个神经元
输出层的神经元的数量是由要预测的性能数量决定的,如果只预测一个性能,比如强度,那输出层就只设计一个神经元,如果预测三个性能,比如强度、硬度、韧性,输出层就设计三个神经元
训练样本
训练人工神经网络,需要搜集一定数量的训练样本。在多数情况下,训练样本的数量越多,人工神经网络的训练就越充分,预测精度就越高
预测
人工神经网络被训练好并经过验证后,就可以进行预测、解决实际问题了
在预测的基础上,还可以进行更深入的工作,比如,对各个因素的影响进行定性和定量分析,包括单因素分析、双因素分析等
径向基RBF神经网络
1985年,Powell提出了多变量插值的径向基函数(Radial Basis Function——RBF)方法。1988年,Broomhead和Lowe首先将RBF应用于神经网络设计,从而构成了RBF神经网络。它是一种局部逼近的神经网络。众所周知,BP网络用于函数逼近时,权值的调节采用的是负梯度下降法,这种调节权值的方法有它的局限性,即存在着收敛速度慢和局部极小等缺点。而RBF神经网络无论在逼近能力、分类能力和学习速度等方面均优于BP网络。径向基函数网络比BP网络需要更多的神经元,但是它能够按时间片来训练网络。
RBF网络的结构与多层前向网络类似,它是具有单隐层的一种两层前向网络。输入层由信号源节点组成。隐含层的单元数视所描述问题的需要而定。输出层对输入的作用作出响应。从输入空间到隐含层空间的变换是非线性的,而从隐含层空间到输出层空间变换是线性的。隐单元的变换函数是RBF,它是一种局部分布的对中心点径向对称衰减的非负非线性函数。
构成RBF网络的基本思想是:用RBF作为隐单元的“基”构成隐含层空间,这样就可将输入矢量直接(即不通过权连接)映射到隐空间。当RBF的中心点确定以后,这种映射关系也就确定了。
隐层节点中的作用函数(核函数)对输入信号将在局部产生响应,也就是说,当输入信号靠近该函数的中央范围时,隐层节点将产生较大的输出。由此可看出这种网络具有局部逼近能力,所以径向基函数网络也称为局部感知场网络。
激活函数都是径向对称的,虽然有各种各样的激活函数,但最常用的是高斯激活函数,如RBF网络隐层第i个节点的输出可由下式表示:
其中,
是第i个隐节点的输出,
是第i个隐节点的标准化常数,q是隐层节点数,
是输入样本,
是第i个隐节点高斯函数的中心向量,此向量是一个与输入样本x的维数相同的列向量,即
。由上式可知,节点的输出范围在0和1之间,且输入样本愈靠近节点的中心,输出值愈大。当
时,
。 RBF网络的学习过程分为两个阶段。
第一阶段,是无教师学习。是根据所有的输入样本决定隐层各节点的高斯核函数的中心向量
和标准化常数
。 第二阶段,有教师学习。在决定好隐层的参数后,根据样本,利用最小二乘原则,求出隐含层和输出层的权值
。有时在完成第二阶段的学习后,再根据样本信号,同时校正隐层和输出层的参数,以进一步提高网络的精度。 下面是一个简单的RBF型神经网络模型的MATLAB编程实例:
t = [2.2 3.9 6.1 7.9 9.8];
net = newgrnn(x,t) % RBF型神经网络的设计
net =
Neural Network
name: 'Generalized Regression Neural Network'
userdata: (your custom info)
dimensions:
numInputs: 1
numLayers: 2
numOutputs: 1
numInputDelays: 0
numLayerDelays: 0
numFeedbackDelays: 0
numWeightElements: 15
sampleTime: 1
connections:
biasConnect: [1; 0]
inputConnect: [1; 0]
layerConnect: [0 0; 1 0]
outputConnect: [0 1]
subobjects:
input: Equivalent to inputs{1}
output: Equivalent to outputs{2}
inputs: {1x1 cell array of 1 input}
layers: {2x1 cell array of 2 layers}
outputs: {1x2 cell array of 1 output}
biases: {2x1 cell array of 1 bias}
inputWeights: {2x1 cell array of 1 weight}
layerWeights: {2x2 cell array of 1 weight}
functions:
adaptFcn: (none)
adaptParam: (none)
derivFcn: 'defaultderiv'
divideFcn: (none)
divideParam: (none)
divideMode: 'sample'
initFcn: 'initlay'
performFcn: 'mse'
performParam: .regularization, .normalization
plotFcns: {}
plotParams: {1x0 cell array of 0 params}
trainFcn: (none)
trainParam: (none)
weight and bias values:
IW: {2x1 cell} containing 1 input weight matrix
LW: {2x2 cell} containing 1 layer weight matrix
b: {2x1 cell} containing 1 bias vector
methods:
adapt: Learn while in continuous use
configure: Configure inputs & outputs
gensim: Generate Simulink model
init: Initialize weights & biases
perform: Calculate performance
sim: Evaluate network outputs given inputs
train: Train network with examples
view: View diagram
unconfigure: Unconfigure inputs & outputs
y=sim(net,x)
2.906309434403926 4.147776726584675 6.000000000000000 7.797729422894987 9.037511338255520
可见预测值与实际值相差很小。
TA15钛合金的性能与热加工工艺参数间存在重要的联系,然而,它们间的关系很复杂,用回归分析等方法得到的精度较差,所以决定采用人工神经网络来进行
人工神经网络(ANN)模型类型的选择
•在传统上,解决预测问题时,人们使用的人工神经网络模型主要是反向传播(BP)型神经网络,但是,这种模型存在一些缺点:收敛速度慢、需要的训练时间长、容易陷入局部极小、预测精度不高等 .
RBF网络用于非线性系统辨识与控制,虽具有唯一最佳逼近的特性,以及无局部极小的优点,但隐节点的中心难求,这是该网络难以广泛应用的原因。
预测钛合金性能的RBF型人工神经网络的MATLAB语句为:
net=newgrnn(Pi,Ti,spread);
其中,Pi指钛合金的加工工艺参数,Ti是钛合金的抗拉强度。Spread是RBF型人工神经网络的一个结构参数,可以通过调整它的大小,来调整网络的预测性能
钛合金的热加工工艺参数包括四个:加热温度、应变量、应变速率、冷却方式,性能只考虑抗拉强度
•所以,我们设计的RBF型神经网络模型如图所示,它包括三层:输入层、输出层及隐含层
输入层有4个节点,分别代表钛合金的4个热加工工艺参数;
隐含层的节点数在训练过程中进行调整,得到最佳值;
输出层包含1个节点,表示抗拉强度
•径向基函数人工神经网络模型也有多种,我们使用其中一种,叫广义回归神经网络
•在MATLAB中,设计广义回归神经网络模型的指令:newgrnn
人工神经网络训练样本和检验样本的搜集
ANN模型的训练
(1)原始数据的预处理
在表中的热加工工艺参数中,冷却方法有两种:空冷和水冷。本文中设计的神经网络模型是用软件实现的,计算机只能识别数字信号,所以必须用数字来表征这两种冷却方法,本文分别用1和2代表空冷和水冷
a= [ 960 0.916 0.0070 1 1000
960 0.350 0.0018 1 943 ];
C1=(C-min(C'))/(max(C')-min(C'))-0.5;
D1=(D-min(D'))/(max(D')-min(D'))-0.5;
E1=(E-min(E'))/(max(E')-min(E'))-0.5;
F1=(F-min(F'))/(max(F')-min(F'))-0.5;
F1 ]'
0.500000000000000 0.500000000000000 -0.125899280575540 -0.500000000000000
0.500000000000000 0.106007067137809 -0.197841726618705 -0.500000000000000
0.500000000000000 -0.215547703180212 -0.219424460431655 -0.500000000000000
0.500000000000000 0.500000000000000 -0.125899280575540 0.500000000000000
0.333333333333333 0.500000000000000 -0.125899280575540 -0.500000000000000
0.333333333333333 0.106007067137809 -0.197841726618705 -0.500000000000000
0.333333333333333 -0.215547703180212 -0.219424460431655 -0.500000000000000
0.333333333333333 0.500000000000000 -0.125899280575540 0.500000000000000
-0.023809523809524 0.500000000000000 -0.125899280575540 -0.500000000000000
-0.023809523809524 0.500000000000000 -0.125899280575540 0.500000000000000

xN表示归一化处理后的结果,x表示初始数据,xmax和xmin分别.表示各个参数的最大值和最小值
(3)神经网络模型的训练
•研究者使用较多的训练方法是“二分法”,即将搜集的所有样本分为两部分,第一部分是训练样本,约占样本总量的80%,第二部分是预测样本,约占样本总量的20%.
另一种训练方法:“留一法”(Leave-One-Out method)
•训练步骤:
第一轮,将第一个样本取出来,用剩余的样本训练神经网络,然后用取出的那个样本测试网络的性能;
第二轮,将第一个样本放回数据库,取出第二个样本,再用其余样本训练神经网络,用取出的那个样本测试网络的性能,……
这样,用所有的样本均测试一遍网络的性能,对神经网络的结构进行优化
训练人工神经网络的MATLAB程序为:
a= [ 960 0.916 0.0070 1 1000
960 0.350 0.0018 1 943 ];
C1=(C-min(C'))/(max(C')-min(C'))-0.5;
D1=(D-min(D'))/(max(D')-min(D'))-0.5;
E1=(E-min(E'))/(max(E')-min(E'))-0.5;
F1=(F-min(F'))/(max(F')-min(F'))-0.5;
Pi=[P(:,1:(i-1)) P(:,(i+1):n) ];
Ti=[T(:,1:(i-1)) T(:,(i+1):n) ] ;
net=newgrnn(Pi,Ti,spread);
errorarray=[Tlie Y0005 ]
103 ×
1.000000000000000 0.984000000000000
0.990000000000000 0.995999999993790
0.987000000000000 0.972999989394710
0.983000000000000 0.973000000000000
0.984000000000000 0.999999999999990
0.996000000000000 0.989999999988282
0.973000000000000 0.986999987364787
0.973000000000000 0.982999999999995
0.990000000000000 1.001999999999969
0.978000000000000 0.973000000000000
Q1=polyfit( x0,y1,3);
警告: 多项式不是唯一的;次数 >= 数据点的数目。
plot( x0,y1,x0,f1,'k-','LineWidth',0.25);
axis([900,1100,900,1100]);
xlabel('抗拉强度 (MPa)','Fontsize',15);
ylabel('预测抗拉强度 (MPa)','Fontsize',15);
% 第一列数据表示实际测试值,第二列表示人工神经网络模型的计算值。
散点图:实际测试值和人工神经网络模型的计算值分别做为横坐标和纵坐标
从图中可以看到,散点图中的点基本上都比较接近45°对角线,说明神经网络对样本的计算精度较高,ANN模型的训练效果较好
评价误差的定量指标
评价误差的定量指标
式中: VCalc-计算值;VMeas-测试值;N-样本数量
可以证明,均方误差和相对均方误差接近0、拟合分值接近2时,表示神经网络模型的计算误差小,训练效果好
MATLAB程序为:
errorarray0003 = [ 1.0000 0.9840
n=size(errorarray0003,1);
mse1=sqrt(sum((Y1-T).^2)/n)
meanrelaerror1=sqrt( sum(((Y1-T)./T).^2)/n)
meanrelaerror1 =
0.016653342319469
fitness21= 1+(sum((Y1-sum(Y1)/n).*(T-sum(T)/n)))/sqrt((sum(Y1.^2)-n*((sum(Y1)/n)^2))*(sum(T.^2)-n*((sum(T)/n)^2)))
fitness21 =
1.850487585690624
从数据可以看到,ANN模型的误差比较小,受到了较好的训练。
ANN模型预测钛合金的抗拉强度
ANN模型经过训练后,就可以用来预测钛合金的抗拉强度了
MATLAB程序为:
a= [ 960 0.916 0.0070 1 1000
960 0.350 0.0018 1 943 ];
C1=(C-min(C'))/(max(C')-min(C'))-0.5;
D1=(D-min(D'))/(max(D')-min(D'))-0.5;
E1=(E-min(E'))/(max(E')-min(E'))-0.5;
F1=(F-min(F'))/(max(F')-min(F'))-0.5;
a1=[ 960 0.916 0.0046 1 1035
960 0.350 0.0024 2 910 ];
C10=(C0-min(C'))/(max(C')-min(C'))-0.5;
D10=(D0-min(D'))/(max(D')-min(D'))-0.5;
E10=(E0-min(E'))/(max(E')-min(E'))-0.5;
F10=(F0-min(F'))/(max(F')-min(F'))-0.5;
b=[hv1 t00]
103 ×
0.999992769872459 1.035000000000000
0.984007230127572 1.020000000000000
0.959602785416576 0.962000000000000
0.946393473758899 0.948000000000000
0.928637325931273 0.921000000000000
0.914999997707419 0.910000000000000
plot( x0,y1, x0,f1,'g-','LineWidth',0.25);
axis([900,1100,900,1100]);
xlabel('Measured tensile strength (MPa)','Fontsize',15);
ylabel('Predicted tensile strength (MPa)','Fontsize',15);
MATLAB神经网络工具箱函数
随着MATLAB软件的版本提高,其对应的神经网络工具箱的内容越来越丰富,它包括了很多现有的神经网络的新成果,涉及的网络模型有,感知机网络、线性神经网络、BP神经网络、径向基神经网络、自组织神经网络、学习向量量化神经网络、Elman神经网络、Hopfield神经网络、自适应滤波和控制系统网络等。
BP网络主要功能有
P=[-1, -2, 3, 1; -1, 1, 5, -3]; % P 为输入矢量
T=[-1, -1, 1, 1]; % T 为目标矢量
net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingdm');
警告: NEWFF used in an obsolete way.
See help for NEWFF to update calls to the new argument list.
inputWeights=net.IW{1,1}
-0.969064876452355 -0.025869755102342
0.817668231449372 0.326091115093844
0.763570995392932 -0.373831165410649
inputbias=net.b{1}
2.935273323924948
-0.734925230818531
2.416916798310611
layerWeights=net.LW{2,1}
-0.156477434747450 0.831471050378134 0.584414659119109
layerbias=net.b{2}
layerbias =
0.918984852785806
net.trainParam.show = 50;
net.trainParam.lr = 0.05;
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-3;
A = sim(net,P)
-0.967280322299628 -1.014573198518491 0.966198779349029 1.038461801871997
E = T - A
-0.032719677700372 0.014573198518491 0.033801220650971 -0.038461801871997
MSE=mse(E)
MSE =
9.761970361529907e-04
曲线拟合案例:
完成
的拟合 隐藏层节点数为15的单输入,单输出的两层BP网络。
T=[-0.832 -0.423 00.024 0.344 1.282 3.456 4.02 3.232 2.102 1.504...
0.248 1.242 2.344 3.262 2.052 1.684 1.022 2.224 3.022 1.984];
net=newff([-1 1],[15 1],{'tansig' 'purelin'},'traingdx','learngdm');
警告: NEWFF used in an obsolete way.
See help for NEWFF to update calls to the new argument list.
net.trainParam.epochs=2500;
net.trainParam.goal=0.001;
当训练次数为365,其训练误差为0.000991<0.001,满足要求。
下面用训练好的网络仿真:
T=[-0.832 -0.423 00.024 0.344 1.282 3.456 4.02 3.232 2.102 1.504...
0.248 1.242 2.344 3.262 2.052 1.684 1.022 2.224 3.022 1.984];
案例:配送中心选址
将专家评价结果作为期望的网络输出。
P=[1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00;
0.80 0.87 0.89 0.82 0.78 0.80 0.75 0.33;
0.67 0.93 0.22 0.75 1.00 0.80 0.49 0.66;
0.92 0.80 0.89 0.92 0.89 0.80 1.00 1.00;
0.87 0.93 1.00 1.00 1.00 1.00 1.00 1.00;
0.80 0.72 0.89 0.82 0.89 0.80 0.75 1.00;
0.67 0.72 0.67 0.66 0.67 0.60 0.49 0.66;
0.72 0.80 0.78 0.75 0.78 0.80 0.75 0.66;
0.60 0.60 0.56 0.58 0.56 0.60 0.49 0.66;
0.47 0.47 0.44 0.41 0.44 0.40 0.49 0.35]';
T=[1.00 0.79 0.74 0.81 0.96 0.83 0.69 0.75 0.58 0.51];
%根据Kolmogorov定理,由于输入层有8个结点,所以中间层有17个结点
%输出层有1个结点,其神经元传递函数为logsig
net=newff(minmax(P),[17,1],{'tansig','logsig'},'trainlm');
警告: NEWFF used in an obsolete way.
See help for NEWFF to update calls to the new argument list.
net.trainParam.epochs=1000;
net.trainParam.goal=0.001;
P_test=[0.40 0.40 0.33 0.33 0.33 0.40 0.49 0.35;
0.08 0.93 0.56 0.92 0.89 0.60 0.24 0.33;
0.67 0.60 0.89 0.82 1.00 0.80 0.75 0.29;
0.32 0.40 0.67 0.33 0.33 0.80 0.75 0.35;
0.87 0.72 0.89 0.92 0.89 0.40 0.49 0.29]';
Y=sim(net,P_test)
0.480201222740837 0.604436747430390 0.631079695468598 0.400755391943065 0.510572282541783
Y= 0.480201222740837 0.604436747430390 0.631079695468598 0.400755391943065 0.510572282541783
可见预测结果:方案13最优,15最差。
数据归一化处理
%使用格式化,使矩阵x1的每一行的最低和最高值映射到默认区间[-1,+1]。
x1 = [1 2 4; 1 1 1; 3 2 2; 0 0 0];
[y1,PS] = mapminmax(x1)
-1.000000000000000 -0.333333333333333 1.000000000000000
1.000000000000000 1.000000000000000 1.000000000000000
1.000000000000000 -1.000000000000000 -1.000000000000000
0 0 0
PS =
name: 'mapminmax'
xrows: 4
xmax: [4×1 double]
xmin: [4×1 double]
xrange: [4×1 double]
yrows: 4
ymax: 1
ymin: -1
yrange: 2
gain: [4×1 double]
xoffset: [4×1 double]
no_change: 0
x2 = [5 2 3; 1 1 1; 6 7 3; 0 0 0];
y2 = mapminmax('apply',x2,PS)
1.666666666666667 -0.333333333333333 0.333333333333333
1.000000000000000 1.000000000000000 1.000000000000000
7.000000000000000 9.000000000000000 1.000000000000000
0 0 0
x1_again = mapminmax('reverse',y1,PS)
模拟正弦函数
P = [-1:0.05:1]; % P 为输入矢量
randn('seed',78341223); % T 为目标矢量
T = sin(2*pi*P)+0.1*randn(size(P));
plot(P,sin(2*pi*P),':'); % 绘制不含噪声的正弦曲线
val.P = [-0.975:0.05:0.975]; % 验证样本的输入矢量
val.T = sin(2*pi*val.P)+0.1*randn(size(val.P)); % 验证样本的目标矢量
net=newff(minmax(P),[5,1],{'tansig','purelin'},'traingdx');
警告: NEWFF used in an obsolete way.
See help for NEWFF to update calls to the new argument list.
net.trainParam.epochs = 500;
[net,tr]=train(net,P,T,[],[],val);
plot(P,A,P,T,'+',P,sin(2*pi*P),':');
参考文献
- Matlab数据分析教程,由伟等,清华大学出版社,2020年1月
- 神经·模糊·预测控制及其MATLAB实现(第4版),李国勇,杨丽娟,电子工业出版社,2018-10-01(案例中的代码有点旧)
- MATLAB R2016a神经网络设计应用27例,顾艳春,电子工业出版社,2018年1月